package statesPattern;

/******************************************************
 *
 * 现在我们创建一个类，它的作用就像是一个状态机。
 *
 ******************************************************/
public class GumballMachine {
    /*******************************************************
     *
     * 首先，找出所有的状态
     *
     * 总共有4个：
     * 没有25分钱  有25分钱   糖果售罄         售出糖果
     *
     *******************************************************/
    State soldOutState;
    State noQuarterState;
    State hasQuarterState;
    State soldState;

    State state = soldOutState;
    //糖果数量
    private int count;

    public GumballMachine(int count) {

        this.count = count;
        soldOutState = new SoldOutState(this);
        noQuarterState = new NoQuarterState(this);
        hasQuarterState = new HasQuarterState(this);
        soldState = new SoldState(this);
        if (this.count>0){
            state = noQuarterState;
        }
    }

    /*********************************************************************
     *
     * 将所有系统中可能发生的动作整合起来
     *
     * 这些动作是糖果机的接口-- 这是你能对糖果机做的事情
     *
     * 投入25分钱     退回25分钱        移动曲柄  发放糖果
     *
     **********************************************************************/


    /*************************************************************
     *
     * 对每一个动作，
     *  * 我们都创建了一个对应的方法，这些方法利用条件语句来决定在每个状态内
     *  什么行为是恰当的
     *******************************************************************/


    public void insertQuarter() {


        state.insertQuarter();
    }

    /***
     * 退回25分钱
     */
    public void turnCrank() {

        state.turnCrank();
        dispense();
    }

    /***
     * 发放糖果
     */
    private void dispense() {
        state.dispense();
    }


    /***
     * 顾客试着转动曲柄...
     */

    public void ejectQuarter() {
        state.ejectQuarter();
    }

    //这个方法允许其他的对象将机器的状态转换到不同的状态
    public void setState(State state){
        this.state = state;
    }

    public void releaseBall(){
        System.out.println("A gumball comes rolling out the slot ....");
        if (count != 0){
            count = count - 1;
        }
    }

    public int getCount() {
        return count;
    }

    @Override
    public String toString() {
        return "Mighty Gumball, Inc.\n" +
                "Java-enabled Standing Gumball Model #2004\n" +
                "Inventory: " + count +
                " gumballs\n"  +
                "Machine is wating for "/*+getStateStr(state)*/+"\n\n";
    }

    public State getHasQuarterState() {
        return hasQuarterState;
    }

    public State getNoQuarterState() {
        return noQuarterState;
    }

    public State getSoldState() {
        return soldState;
    }

    public State getSoldOutState() {
        return soldOutState;
    }

//    private String getStateStr(State state) {
//        switch (state ){
//            case NO -> {
//                return "quarter";
//            }
//            case HAS_QUARTER -> {
//                return "turn crank";
//            }
//            case SOLD -> {
//                return "rolling out a gumball";
//            }
//            case SOLD_OUT -> {
//                return "sold out";
//            }
//        }
//        return null;
//    }
}
